package com.bgyrobot.coordinate;

import com.bgyrobot.coordinate.model.CoordinateSystem;
import com.bgyrobot.coordinate.model.CoordinateTransform;
import com.bgyrobot.coordinate.model.ReferencePoint;

/**
 * 综合地理转换，可缓存耗时计算
 * @author hesu
 */
public interface ITransform {
    
    ICoordinateSystemProvider getLocalProvider();
    
    String[] getGeoCoordinateSystems();

    /**
     * 根据 坐标系名称， 获取坐标系。（自动缓存）
     * @param csName 坐标系名称
     * @return 坐标系
     */
    CoordinateSystem getCoordinateSystem(String csName);

    /**
     * 根据 源坐标系名称，目标坐标系名称，参考点，获取坐标转换参数。（自动缓存）
     * @param srcCS 源坐标系名称
     * @param tgtCS 目标坐标系名称
     * @param refPoint 参考点
     * @return 坐标转换参数
     */
    CoordinateTransform getCoordinateTransform(String srcCS, String tgtCS, ReferencePoint refPoint);
    
    /**
     * 根据 坐标系名称列表，参考点，获取多个坐标系之间的相互转换参数表。（自动缓存）
     * @param csNames 坐标系名称列表
     * @param refPoint 参考点
     * @return 相互转换参数表
     */
    CoordinateTransform[] getCoordinateTransformTable(String[] csNames, ReferencePoint refPoint);

    /**
     * 缓存/清除缓存 一个坐标系
     * @param cs 坐标系
     * @param isSave true则缓存，false则清除缓存
     */
    boolean cacheCoordinateSystem(CoordinateSystem cs, boolean isSave);
    
    /**
     * 坐标转换中是否包含地理坐标转换
     * @param srcCS 源坐标系名称
     * @param tgtCS 目标坐标系名称
     * @return true包含，false不包含
     */
    boolean hasGeotransform(String srcCS, String tgtCS);

    /**
     * 获取坐标转换矩阵（不包含地理坐标转换）
     * @param srcCS 源坐标系名称
     * @param tgtCS 目标坐标系名称
     * @return 转换矩阵
     */
    double[][] getMatrixWithoutGeotransform(String srcCS, String tgtCS);

    /**
     * 获取坐标转换矩阵（包含地理坐标转换，需要参考点）
     * @param srcCS 源坐标系名称
     * @param tgtCS 目标坐标系名称
     * @param refPoint 参考点
     * @return 转换矩阵
     */
    double[][] getMatrixWithGeotransform(String srcCS, String tgtCS, ReferencePoint refPoint);
    
    /**
     * 执行坐标转换（不包含地理坐标转换）
     * @param srcCS 源坐标系名称
     * @param tgtCS 目标坐标系名称
     * @param coords 坐标序列
     * @return 转换后的坐标序列
     */
    double[][] executeWithoutGeotransform(String srcCS, String tgtCS, double[][] coords);
    
    /**
     * 执行坐标转换（包含地理坐标转换）
     * @param srcCS 源坐标系名称
     * @param tgtCS 目标坐标系名称
     * @param refPoint 参考点
     * @param coords 坐标序列
     * @return 转换后的坐标序列
     */
    double[][] executeWithGeotransform(String srcCS, String tgtCS, ReferencePoint refPoint, double[][] coords);
    
    /**
     * 执行坐标转换（使用原生的地理坐标转换（非拟合矩阵））
     * @param srcCS 源坐标系名称
     * @param tgtCS 目标坐标系名称
     * @param coords 坐标序列
     * @return 转换后的坐标序列
     */
    double[][] executeWithNativeGeotransform(String srcCS, String tgtCS, double[][] coords);

    /**
     * 执行坐标转换（使用矩阵）
     * @param transform 转换矩阵
     * @param coords 坐标序列
     * @return 转换后的坐标序列
     */
    double[][] executeMatrixTransform(double[][] transform, double[][] coords);

}